	public function executeBatch(sfWebRequest $request)
	{
		$request->checkCSRFProtection();

		if (!$ids = $request->getParameter('ids'))
		{
			$this->getUser()->setFlash('error', 'Debe seleccionar al menos un elemento.');

			$this->redirect('@<?php echo $this->getUrlForAction('list') ?>');
		}

		if (!$action = $request->getParameter('batch_action'))
		{
			$this->getUser()->setFlash('error', 'Seleccione la acción que quiera ejecutar sobre los elementos seleccionados.');

			$this->redirect('@<?php echo $this->getUrlForAction('list') ?>');
		}

		if (!method_exists($this, $method = 'execute'.ucfirst($action)))
		{
			throw new InvalidArgumentException(sprintf('Debe crear el método "%s" para la acción "%s"', $method, $action));
		}

		if (!$this->getUser()->hasCredential($this->configuration->getCredentials($action)))
		{
			$this->forward(sfConfig::get('sf_secure_module'), sfConfig::get('sf_secure_action'));
		}

		try
		{
			$validator = new sfValidatorDoctrineChoice(array('multiple' => true, 'model' => '<?php echo $this->getModelClass() ?>'));
			// validate ids
			$ids = $validator->clean($ids);

			// execute batch
			$this->$method($request);
		}
		catch (sfValidatorError $e)
		{
			$this->getUser()->setFlash('error', 'Se ha producido un error al borrar los elementos seleccionados porque al menos uno de ellos ya no existe.');
		}
		catch (Exception $e)
		{
			$this->getUser()->setFlash('error', 'Se ha producido un error al realizar la acción seleccionada.');
			$this->logError($e->getMessage());
		}

		$this->redirect('@<?php echo $this->getUrlForAction('list') ?>');
	}

	protected function executeBatchDelete(sfWebRequest $request)
	{
		$ids = $request->getParameter('ids');

		$records = Doctrine_Query::create()
			->from('<?php echo $this->getModelClass() ?>')
			->whereIn('<?php echo $this->getPrimaryKeys(true) ?>', $ids)
			->execute();

		foreach ($records as $record)
		{
			$record->delete();
		}

		$this->getUser()->setFlash('notice', 'Los elementos seleccionados se han borrado correctamente.');
	}
